/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import javax.sql.DataSource;
import suministros.ejb30.TO.DetalleInventarioTO;
import suministros.ejb30.TO.InventarioTO;
import suministros.ejb30.entity.DetalleInventario;
import suministros.ejb30.entity.DetalleInventarioPK;
import suministros.ejb30.entity.Inventario;
import suministros.ejb30.helper.Utiles_Convertir;
import suministros.ejb30.helper.Utiles_Fecha;
/**
 *
 * @author Diana
 */
@Stateless
public class SumiGestionInventarioDAO implements SumiGestionInventarioDAOLocal {

  private int pagActual;
  private int maxResults;
  private int pagTamanno;
  private int tamañoTotal;

  @PersistenceUnit(unitName="suministros-pu")
  EntityManagerFactory emf;

  EntityManager em;

  @Resource(name="jdbc/Administracion")
  DataSource dsAdministracion;

  @PostConstruct
  public void inicializaBean()
  {
    this.em = this.emf.createEntityManager();
  }

  @PreDestroy
  public void finalizaBean() {
    this.em.close();
  }
  public String iniciarInventario(Inventario inv) throws Exception
  {
    Utiles_Fecha fecha = new Utiles_Fecha(inv.getFechaInicio());
    String retorno = null;
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{ call [dbo].[sp_sumi_iniciarInventario](?,?,?,?,?)}");
      csLlamada.setDate(1, new java.sql.Date(inv.getFechaInicio().getTime()));
      csLlamada.setString(2, inv.getAno());
      csLlamada.setString(3, inv.getMes());
      csLlamada.setString(4, inv.getDescripcion());
      csLlamada.registerOutParameter(5, 12);
      csLlamada.execute();
      retorno = csLlamada.getString(5);
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionInventarioDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    return retorno;
  }//
  public Boolean terminarInventario(Inventario inv) throws Exception
  {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
      try {
          Inventario inventa = this.em.find(Inventario.class, inv.getCodInventario());
          inventa.setFechaFin(inv.getFechaFin());
          inventa.setEstado(Boolean.FALSE);
          this.em.merge(inventa);
          this.em.flush();
          tx.commit();
          estado=true;
      } catch (Exception e) {
         tx.rollback();
          throw e;
      }

    return estado;
  }//
   public InventarioTO getDatosInventario() throws Exception {
        InventarioTO inv= null;
        Query consulta = this.em.createNativeQuery("select codInventario, fechaInicio, ano, mes, descripcion, estado from  INVENTARIO where estado='1'");
        if(!consulta.getResultList().isEmpty()){
         inv= Utiles_Convertir.convertirToTableBeanBinding_Inventario(consulta.getResultList()).get(0);
        }
        return inv;
     
   }
   public List<DetalleInventarioTO> getListaDetalleInventario(String empresa, String inventario){
         Query consulta= this.em.createNativeQuery("Select di.codInventario, di.id_suministro, " +
                 " di.descripcion, di.unidad,di.precioPromedio, di.cantidadActual, di.montoActual ," +
                 " di.existenciaFisica, di.id_empresa from detalleInventario di  where  di.id_empresa='"+empresa+"' " +
                 " and di.codInventario='"+inventario+"' order by  di.descripcion ")  ;

         //List<DetalleInventarioTO> lista= Utiles_Convertir.convertirToTableBeanBinding_DetalleInventario(consulta.setFirstResult(pagActual*pagTamanno).setMaxResults(pagTamanno).getResultList());
         List<DetalleInventarioTO> lista= Utiles_Convertir.convertirToTableBeanBinding_DetalleInventario(consulta.getResultList());
     return lista;
     }
  
         public int iniciaConfiguracion(int pagTamanno){
            this.pagTamanno = pagTamanno;
            pagActual = 0;
            /*Query consulta= this.em.createNativeQuery("Select di.codInventario,di.id_ambiente, a.descripcion," +
             " di.id_pabellon, p.descripcion, di.id_estante, e.descripcion, di.id_casilla, c.descripcion," +
             " di.id_suministro, di.descripcion, di.unidad,di.precioPromedio, di.cantidadActual,di.montoActual ," +
             "di.existenciaFisica from detalleInventario di inner join ambiente a on di.id_ambiente= " +
             "a.id_ambiente inner join pabellon p on di.id_pabellon=p.id_pabellon inner join estante e" +
             " on di.id_estante= e.id_estante inner join casilla c on di.id_casilla=c.id_casilla " +
             " where di.id_subalmacen='1' order by di.id_casilla, di.id_estante, di.descripcion")  ;

          List<DetalleInventarioTO> lista= Utiles_Convertir.convertirToTableBeanBinding_DetalleInventario(consulta.getResultList());
          if(!lista.isEmpty()){
              this.tamañoTotal= lista.size()/this.pagTamanno;
          }*/
          return tamañoTotal;
        }

        public int siguiente() {
            pagActual++;
            if(pagActual>tamañoTotal){
                pagActual=tamañoTotal;
            }
            return pagActual;
        }

        public int anterior() {
            pagActual--;
            if (pagActual < 0) {
                pagActual = 0;
            }
            return pagActual;
        }
         public int siguienteTodo() {
            pagActual=tamañoTotal;
            return pagActual;
        }

        public int anteriorTodo() {
            pagActual = 0;
            return pagActual;
        }

    public Boolean registrarStock(List<DetalleInventarioTO> listainv) throws Exception
    {
    boolean estado=false;
    EntityTransaction tx = this.em.getTransaction();
    tx.begin();
    try {
        for(DetalleInventarioTO detalle: listainv){
            DetalleInventarioPK dinvpk= new DetalleInventarioPK(detalle.getCodigo(),detalle.getCodSuministro(), detalle.getEmpresa());
            DetalleInventario detInventario=this.em.find(DetalleInventario.class,dinvpk);
            BigDecimal diferencia= detalle.getCantidadActual().subtract(detalle.getExistenciaFisica());
            detInventario.setExistenciaFisica(detalle.getExistenciaFisica());
            detInventario.setMontoFisico(detalle.getExistenciaFisica().multiply(detalle.getPrecioPromedio()));
            detInventario.setFechaOperacion(new Date());
            if(diferencia.compareTo(BigDecimal.ZERO)>0){
                detInventario.setCantidadFaltante(BigDecimal.ZERO);
                detInventario.setMontoFaltante(BigDecimal.ZERO);
                detInventario.setCantidadSobrante(diferencia);
                detInventario.setMontoSobrante(diferencia.multiply(detalle.getPrecioPromedio()));


            }
            if(diferencia.compareTo(BigDecimal.ZERO)<0){
                detInventario.setCantidadSobrante(BigDecimal.ZERO);
                detInventario.setMontoSobrante(BigDecimal.ZERO);
                BigDecimal diferencian= diferencia.multiply(new BigDecimal(-1));
                detInventario.setCantidadFaltante(diferencian);
                detInventario.setMontoFaltante(diferencian.multiply(detalle.getPrecioPromedio()));
            }
            if(diferencia.compareTo(BigDecimal.ZERO)==0){
                detInventario.setCantidadFaltante(BigDecimal.ZERO);
                detInventario.setMontoFaltante(BigDecimal.ZERO);
                detInventario.setCantidadSobrante(BigDecimal.ZERO);
                detInventario.setMontoSobrante(BigDecimal.ZERO);
            }
            this.em.merge(detInventario);
        }

        this.em.flush();
    tx.commit();
    estado=true;
    } catch (Exception e) {
    tx.rollback();
    throw e;
        }
     return estado;
  }//

 
}
